Skip to content

feat(local): ask a local checkpoint its options by letter - #102

Merged
TMHSDigital merged 1 commit into
mainfrom
feat/local-letter-options
Sep 25, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
feat/local-letter-options

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Part of #3. This implements the decision on multi-token options: letter labels, opt-in.

What it does. --option-style letter (the adapter argument is option_style="letter") lists the options as A. pay_full_estimate, B. deny_vacancy_exclusion, … and reads the logits of the single-token letters.

  • The distribution maps back to the real labels, so nothing downstream changes.
  • The default instructions ask for the letter.
  • A case with more than 26 options is refused by name.
  • The default is still label, which reads each option's own token and refuses multi-token options. Its refusal message now suggests letter mode.

Recorded everywhere.

  • call_params includes option_style only in letter mode, so every existing label-mode cache key is unchanged (tested). Letter mode already keys on option order, since label_order_matters holds for this arm.
  • Each prediction's raw carries option_style and the label-to-letter map.
  • The artifact config records option_style.
  • The dry run and the report each print a line saying the options were asked by letter, and that a lettered question is a different question.

Run for real. Pinned Qwen2.5-1.5B-Instruct on the GPU, over the public fixture:

by label (default) by letter
Scored 39 of 105 105 of 105
Accuracy 0.4615 vs chance 0.4957: INCONCLUSIVE 0.3429 vs chance 0.3416: INCONCLUSIVE
ECE 0.1257 vs floor 0.1016: INCONCLUSIVE 0.3493 vs floor 0.0869: distinguishable
Latency p50 / p99 71 / 488 ms 134 / 690 ms

With every row scored, the null tells you something it couldn't before: the model is at chance accuracy but confident, and that miscalibration is clearly distinguishable from noise.

Why not sequence probability? Longer options would lose probability for being long, and every length correction is a choice the result would silently depend on. METHODOLOGY's restricted_softmax section now covers both readings and this reasoning.

Tests cover multi-token options asked by letter, the default letter instructions, more than 26 options refused, the cache key moving only in letter mode, an unknown style refused, and the CLI flag reaching the local arm while the mock refuses it. docs/example-report.md is unchanged. The gate, the site checks and the prose checks all pass.

🤖 Generated with Claude Code

The local arm read each option's own token and refused options that are
several tokens, so on the public fixture it scored 39 of 105 rows.
--option-style letter lists the options as A, B, C and reads the letter
tokens: every row scores, the distribution still maps back to the labels,
and the artifact and the report say the question was lettered. The style
joins the cache key only when it is letter, so existing entries keep
theirs. Run for real, the pinned Qwen2.5-1.5B landed at chance accuracy
with an ECE of 0.349 against a floor of 0.087.

Sequence probability was the alternative and was not taken: longer options
lose probability for being long, and any length correction is a choice the
result would silently depend on. METHODOLOGY says so.

Part of #3.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@TMHSDigital
TMHSDigital merged commit 8418b21 into main Sep 25, 2026
23 checks passed
@TMHSDigital
TMHSDigital deleted the feat/local-letter-options branch September 25, 2026 21:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant